TSKaigi 2026
https://2026.tskaigi.org/ogp.png
TSKaigi 2026
tscからtsgoへ ── DenoのTypeScript基盤はどう変わったか | TSKaigi 2026
https://www.docswell.com/s/magurotuna/59NRVP-tskaigi-2026
deno check(型チェック)とLSPにまつわる話
実行パスと診断パスの分離
診断パスはTypeScriptが扱える形に変換する
実行パスはtscやtsgoは介在しない
DenoはSWCを使ってTypeScript特有の型注釈をはがす
昔のdeno runは型チェックもになっていた
--no-checkでスキップ可能に
deno checkが追加とdeno runは型チェックしないのがデフォルトに
tsgoへの移行・フォーク、npmからそのまま持ってきて使えないか?というフェーズに
https://gyazo.com/d04b49c474b78c1f8cc8525d425afecc
jsr:パッケージ、npm:パッケージ→TypeScriptが理解できる情報にする
import maps: Deno側で解釈
Deno特有の型: *.d.ts
Denoの内部にはtscそのものを当てている
実行時のコストはV8 code cacheにより最適化している(コールドスタートに近い状態)
LSPはコードの変更差分に合わせて対応する必要があって複雑性が高い
feat(unstable): typescript-go integration for deno check by nathanwhit · Pull Request #30920 · denoland/deno · GitHub
denoland/typescript-goというフォークしてパッチ当てたもの
Deno固有の概念をtsgoではできなかった
パフォーマンス
型チェックしたら約2倍のベンチマーク
https://gyazo.com/73c4d222e606f407981b37442774417d
subprocess で立ち上げ stdio IPCで繋ぐ
型チェック中にDenoを聞きにいくcallbackを足した
LSPはエディタとの双方向プロトコルをtsgoに被せる必要がある
refactor: remove forked typescript-go infrastructure by bartlomieju · Pull Request #33133 · denoland/deno · GitHub
forkしたものを削除
公式TypeScriptに寄せる方向(純粋に使用する方法に)
deno installでtsconfigを生成する
https://gyazo.com/b87385e63f6509f62725ca03ad92c4cd
業務に残された「よくない型」で考える「TypeScriptの難しさ」 | TSKaigi 2026
頻出例
動的境界での型落ち
DOM Event /ctach
bubblingで型が広くなってしまう
Errorインスタンス
instanceofでnarrow
型ガードを共通化してもよい
unknownでas
境界で型ガードしよう
文字列からBranded型やリテラル型の限界
型ガードやヘルパーを書く
LowerCaseなどのユーティリティ
動的な配列
Array.filter, includes, isArray
リテラル型を強制される
通常な配列にすると型が落ちる
isArrayは要素型を持たない
https://github.com/mattpocock/ts-reset
配列関係のヘルパーの提供
Object.fromEntries / Object.keys
構造的部分型の限界
型の書いてないキーもobjectと同じ型として通りうる
discriminated union
対応したい値を別に組み立てる
switchでfactoryのような形で対応させてセットさせる
引数のUnionから返り値を推論しづらい
引数の方に応じて帰り値の型を帰る関数をジェネリックに書けない
overload関数で対応するが数が多くて大変
correlated unionsとしての改善
unionの結びつきの推論への改善はしている
分類の軸を考えてみる
境界で起きているのか・内部で起きているのか
安全圏に戻せるのか・難しいのか
どうやったらこの問題に気づける?
権限チェックの一貫性を型で守る TypeScript による多層防御 | TSKaigi 2026
Flyle: VoC分析をエンタープライズ向けに展開するデータ管理プラットフォーム
データベースワークフロー基盤
なぜ権限制御は複雑になりやすいか
組織構造や運用ルールで複雑化になる
フォルダ階層における権限
権限の表し方
アクション
リソースクエリ
効果
TypeScriptでの権限を一貫性整理を行う
同じ判定が複数レイヤーで出てくる
TABLE:SELECTでもそれぞれ異なる
フロントエンド、API、PostgreSQL
問題を整理する
全部じゃなくて守りはどこにおくのか見え方が変わってくる
守りの根幹はDBにおくことに
最後に認可を弾くのはDBで担保
DBと同じ権限ポリシーに合わせて実装
一貫性を型で守る
権限ポリシーをSSoTとして管理
Valibotを使用しドメインの型を管理
DBとの値集合を型で検出する
アクションの語彙はDBにもenum型で存在することがある
語彙が二重にある
テストで検出できるようにExcludeテストで担保する
意味の異なる型をブランド型で区別
文字列ではあるが意味は異なる
string型の取り違えかた防ぐ
派生定義を受動追従
Template Literal Typesで型レベル分解
分岐漏れを検出
as const satisfiesでチェックする
権限チェックの呼び忘れはリンターで防ぐ
ビジネスロジックはテストで担保する
checker.tsにチキンレースを仕掛けてみた:型エラー(TS2589)が発生する境界線を求めて | TSKaigi 2026
TS2589は複雑性の高いコードの場合でてくるエラー
深さを見る
インスタンス化回数
ループ
型の深宇宙へ飛び込め ─ tscを遅くする記述パターンの全解剖 ─ | TSKaigi 2026
再帰型
Union
Mapped
homomorphic
GitHub - microsoft/typescript-analyze-trace: A tool for analyzing the output of tsc --generateTrace · GitHub
決定論的な型チェックへ:Go 製コンパイラによる10倍速の裏側で --stableTypeOrdering から見える並列化への挑戦 | TSKaigi 2026
checker.tsの内部を見ていく
typeIDを取り出して数値として比較する二部探索
JS シングルスレッド
Go 並行モデル
goroutine
型決定が非決定性をもつことになる
CompareTypes
TypeScriptのclassはなぜこうなったのか — 歴史・落とし穴・そして使いどころを探る | TSKaigi 2026
歴史
ECMAScript4でクラスが提案されたが廃棄
CoffeeScriptなどのAltJSが広がる
ES2015で最小限のclass機能を策定
落とし穴
構造的部分型
持っているプロパティと関数で互換性が決まる
同じ構造なら同じものとみなす
instanceofを通すと型エラーになる
discriminated union
プロトタイプベース
関数の呼び出しかたでthisが決まる
Stage 3 Decorators でできること / できないこと | TSKaigi 2026
デコレータとは何か
class機能拡張
メタデータの付与
高階関数のような役割
ユースケース
ログやトレースを出す
DI
ORM, シリアライゼーション
--experimantalDecoratorsでStage 3が使える
Stage 3
Class fields
privateは完全非対応
staticの区別ができない
初期化ロジックに触れない
3からサポート
Auto-accessors
フィールド部分をgetter/setterで自明的に書く必要があった
パターン記述が簡単になった(自動生成できる)
メタデータをSymbol.metadataで読み書きできる
よくない話?
自由度が減った
prototypeやdescriptorを触ってclassの形を変更できる
直接の対象しか触れなくなった
クラスの形が静的に決まったのでエンジンの最適化に優しい
引数デコレータの未サポート
本質的には必要ではないはず
--emitDecoratorMetadata非対応
コンパイル時に型情報をメタデータを付与する機能
そもそも標準化の機能ではない
仕様やエコシステムは今どういう状況
やや厳しい。。。
Test262が未完成
テストケースと仕様の記述に矛盾が指摘されている
トランスパイラはメジャーなところはStage 3の仕様を実装済み
oxcはまだ
ブラウザエンジンは未実装
V8とSpiderMonkeyでは実装が進んでいるがまだまだ
MobX以外のライブラリはStage 3以降の対応ができていない
引数に対するデコレータはStage 1
関数と一緒に進めるべき?
TS 7: How We Got There | TSKaigi 2026
制約と時代から読み解くTypeScriptコンパイラ設計史 | TSKaigi 2026
Symbol
ES6とは別
Binder
ASTとSymbolとを結びつける
一番独特な部分
ASTがセマンティックな情報を持っている
循環参照
AST親子で循環参照
ASTとSymbolもできる
Symbol親子も
Red-Green Treeが良さげだが採用はされなかったがJSだとimmutabilityを活かせない、メモリ消費がオブジェクトだとヘッダがついて微妙なので循環参照させる方向
Checker
ASTとSymbolを使って型を計算・検査
LLM時代のリファクタリング戦略:AIエージェントによる段階的・安全なTS移行方法 | TSKaigi 2026
ブログAIエージェントによる段階的・安全なTypeScript移行方法 - PLAY DEVELOPERS BLOG
コーディングエージェントはTypeScriptの型エラーをどう自己修正しているのか | TSKaigi 2026
コーディングエージェントはTypeScriptの 型エラーをどう自己修正しているのか - Speaker Deck
TypeScriptでPlatform SDKを作る技術 | TSKaigi 2026
Node.js+TypeScriptにおけるCJS/ESM相互運用の最新ポイント | TSKaigi 2026
dynamic importはしんどい
enum よ、さようなら | TSKaigi 2026
inferと仲良くなる10分間 | TSKaigi 2026
いつテストを書くか?―ソフトウェア開発における安心と不安について考える | TSKaigi 2026
Is High Quality Software Worth the Cost?
内部品質が低いと機能を作りづらくなる→保守性の限界
ソフトウェアの保守性は変更容易性のこと
変更したいときに変えられないのはソフトウェアの死
変更容易性は人間とソフトウェアとの関係
容易なのか困難なのかは人間が抱く感覚
変更容易性
予期的なもの
感覚として変更できそうと思えるもの
不安・恐怖の程度
経験的なもの
やってみての労力
影響範囲や大きさ
副作用
開放閉鎖原則
修正に対して閉じている
モジュールの振る舞いを変えてはいけない→閉じているべき
閉じている既存の要求を満たす振る舞いが変わらないようにする
拡張に対して開いている
モジュールには新しい振る舞いを追加できないようにする
ソフトウェアアーキテクチャとは開放閉鎖原則を達成できていることである
テストは開発者の不安とりのぞく
閉鎖が保証されている
構造上の問題を教える
お前のソフトウェアはテストをかけるのか?という試金石
既存のテストに影響があるなら閉じていない
テストを書くのが大変なら開いていない
静的解析への投資がAI時代のコード品質を支える ── カスタムESLintルールの設計と運用 | TSKaigi 2026